指针

  对类型T,T*是“到T的指针”类型,也就是说,一个类型为T*的变量能保存一个类型T的对象的地址。例如,

    char c = 'a';
    char* p = &c;        // p保存着c的地址

不幸的是,到数组的指针和到函数的指针需要更复杂的记法:

    int* pi;            // 到int的指针
    char** ppc;         // 到字符的指针的指针
    int* ap[15];        // 15个到int的指针的数组
    int (*fp)(char*)    // 到函数的指针,这种函数以char*为参数,返回int
    int* f(char*);      // 有一个char*参数的函数,返回一个到int的指针

参看4.9.1节有关声明语法的解释,以及附录A中的完整语法。

  对指针的基本操作是间接引用,也就是说,引用被指针所指的那个对象。这一操作也被称作间接。间接运算符(前缀)一元*。例如,

    char c = 'a';
    char* p = &c;    // p保存着c的地址
    char c2 = *p;    // c2 == 'a'

被p所指的变量是c,而c中所存的值是'a'。所以由*p赋给c2的值就是'a'。

  对于指向数组元素的指针可以执行一些算术元素(5.3节)。指向函数的指针非常有用,有关问题将在7.7节介绍。

  指针的实现是希望能直接映射到程序运行所在的机器上的地址机制。许多机器可以对字节寻址。那些不能这样做的机器多半都有能从机器字中取出字节的硬件功能。在另一方面,还有极少数的机器可以寻址到单个的二进制位。由于这些情况,能够独立地进行分配和通过内部指针类型指向的最小对象就是char。请注意,一个bool量最少爷要占据像char那么大的空间(4.6节)。如果想更紧凑地存储更小的值,你可以使用按位逻辑操作(6.2.4节)或者结构中的位域(C.8.1节)。

🔚